package com.yupi.example.consumer;

import com.yupi.example.common.model.User;
import com.yupi.example.common.service.UserService;
import com.yupi.yurpc.proxy.ServiceProxyFactory;

/**
 * @program: yu-rpc
 * @description: Java Lotus
 * @author: spring
 * @create: 2024-10-23
 * 简易服务消费者示例
 */
//提供服务，这个是rpc远程的服务提供者
public class EasyConsumerExample {

    public static void main(String[] args) {

        //静态代理
        //静态代理虽然很好理解（就是写个实现类嘛），
        // 但缺点也很明显，我们如果要给每个服务接口都写一个实现类，是非常麻烦的，这种代理方式的灵活性很差！
//        UserServiceProxy userServiceProxy = new UserServiceProxy(); 静态代理我们很少去使用
        //这个地方我们选择去使用反射加动态代理的形式去进行相关的实现
        // 动态代理
        //这样的话我们每去实现一个相关的用户名去使用这个User类去进行实现的时候，我们就可以去UserService.class调用这个接口
        //从而去获取一个相关的代理，这样的话，在我们的接口中通过代理产生了一个新的类
        UserService userService = ServiceProxyFactory.getProxy(UserService.class);

        /*
        需要注意的是，现在是无法获取到 userService 实例的，所以预留为 null。
        我们之后的目标是，能够通过 RPC 框架，快速得到一个支持远程调用服务提供者的代理对象，
        像调用本地方法一样调用 UserService 的方法。
         */
        User user = new User();
        user.setName("spring");

        // 调用，使用if进行调用后的判断
        User newUser = userService.getUser(user);
        if (newUser != null) {
            System.out.println(newUser.getName());
        } else {
            System.out.println("user == null");
        }

    }
}
